
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.vp.*;
import javax.swing.JFrame;
import java.util.*;

/**
* Klasse, in der das Partikelsystem mittels Threads ausgefuehrt wird.
*
* @author Frank Klawonn
* Letzte Aenderung 1.8.2008
*
*/
public class SimpleParticleSystemRunner extends Thread
{

  //Das Partikelsystem, das ausgefuehrt werden soll
  public SimpleParticleSystem ps;

  //Variable, um festzustellen, ob die Aktivitaetsdauer des Partikelsystem abgelaufen ist
  public boolean isTerminated;


  /**
  * Konstruktor
  *
  * @param partSys   Das zugehoerige Partikelsystem  
  */
  public SimpleParticleSystemRunner(SimpleParticleSystem partSys)
  {
    ps = partSys;
    isTerminated = false;
  }



  /**
  * Die eigentliche Ausfuehrung des Partikelsystems
  *
  */
  public void run()
  {

    //Zunaechst wird die Zeit abgewartet, bis das Partikelsystem beginnen soll. 
    try
    {
      sleep(ps.delay);
    }
    catch(InterruptedException e)
    {
       System.out.println("Error");
    }


    //Die BranchGroup, die das Partikelsystem aufnehmen soll.
    //Diese BranchGroup wird direkt der Transformationsgruppe fuer 
    //das Partikelsystem zugeordnet.
    BranchGroup bgParticleSystem = new BranchGroup();
    bgParticleSystem.setCapability(BranchGroup.ALLOW_DETACH);
    bgParticleSystem.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);
    bgParticleSystem.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);
    bgParticleSystem.setCapability(BranchGroup.ALLOW_CHILDREN_READ);

    ps.tg.addChild(bgParticleSystem);



    //Ein Thread, der sich meldet, wenn die Aktivitaetsdauer des Partikelsystems
    //abgelaufen ist.
    SimpleParticleSystemTerminator pst = new SimpleParticleSystemTerminator(this);
    pst.start();


    //Erzeugung der einzelnen Partikel in eigenen Threads
    while(!isTerminated)
    {
      //Erzeugung eines neuen Partikels
      SimpleSingleParticleCreator sspc = new SimpleSingleParticleCreator(ps,bgParticleSystem);
      sspc.start();

      //Wartezeit bis zum naechsten Partikel abwarten
      try
      {
        sleep(ps.interarrivalTime.getNextLong());
      }
      catch(InterruptedException e)
      {
        System.out.println("Error");
      }
    }

    bgParticleSystem.removeAllChildren();


  }







}
